home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / gui / uberwidgets / UberEmotiBox.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  6KB  |  174 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. import os.path as os
  6. import math
  7. import wx
  8. from gui import skin
  9. from gui.skin.skinobjects import Margins
  10. from gui.toolbox.imagefx import wxbitmap_in_square
  11. from gui.toolbox import Monitor, AutoDC
  12. from util import do
  13. from wx import TextCtrl
  14. UberEmotiBase = wx.PopupTransientWindow
  15.  
  16. class UberEmotiBox(UberEmotiBase):
  17.     
  18.     def __init__(self, parent, emoticons, textctrl):
  19.         UberEmotiBase.__init__(self, parent, style = wx.NO_BORDER)
  20.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  21.         self.SetExtraStyle(wx.WS_EX_PROCESS_IDLE)
  22.         self.Bind(wx.EVT_PAINT, self.OnPaint)
  23.         self.UpdateSkin()
  24.         self.textctrl = textctrl
  25.         (self.pemoticons, pwidth, pheight) = self.Arrange(self, emoticons)
  26.         self.lesssize = (pwidth, pheight)
  27.         self.SetSize(self.lesssize)
  28.  
  29.     
  30.     def UpdateSkin(self):
  31.         skin_elements = [
  32.             ('padding', 'padding', (lambda : wx.Point(3, 3))),
  33.             ('margins', 'margins', skin.ZeroMargins),
  34.             ('esize', 'emoticonsize', 19),
  35.             ('espace', 'emoticonspace', 23),
  36.             ('bg', 'backgrounds.window', None)]
  37.         for attr, skinattr, default in skin_elements:
  38.             setattr(self, attr, skin.get('emotibox.' + skinattr, default))
  39.         
  40.  
  41.     
  42.     def Arrange(self, parent, emots):
  43.         width = round(math.sqrt(len(emots)))
  44.         if width < 4:
  45.             width = 4
  46.         
  47.         if width > 7:
  48.             width = 7
  49.         
  50.         size = self.espace
  51.         padding = self.padding
  52.         margins = self.margins
  53.         cx = padding.x + margins.left
  54.         cy = padding.y + margins.top
  55.         emoticons = []
  56.         count = 0
  57.         for emot in emots:
  58.             emoticons.append(Emoticon(parent, emot, (cx, cy)))
  59.             cx += size + padding.x
  60.             count += 1
  61.             if count == width:
  62.                 cx = padding.x
  63.                 cy += size + padding.y
  64.                 count = 0
  65.                 continue
  66.         
  67.         if cx != padding.x:
  68.             cy += size + padding.y
  69.         
  70.         across = width * (size + padding.x) + padding.x + margins.x
  71.         cy += margins.bottom
  72.         if cy < across:
  73.             cy = across
  74.         
  75.         return (emoticons, across, cy)
  76.  
  77.     
  78.     def OnPaint(self, event):
  79.         dc = AutoDC(self)
  80.         self.bg.Draw(dc, self.ClientRect)
  81.  
  82.     
  83.     def Display(self, rect):
  84.         pos = rect.BottomLeft
  85.         newrect = wx.RectPS(pos, self.Size)
  86.         screenrect = Monitor.GetFromRect(newrect).ClientArea
  87.         if newrect.bottom > screenrect.bottom:
  88.             pos.y -= rect.height + self.Size.height
  89.         
  90.         if newrect.right > screenrect.right:
  91.             pos.x += rect.width - self.Size.width
  92.         
  93.         self.SetPosition(pos)
  94.         self.Popup()
  95.  
  96.  
  97.  
  98. class Emoticon(wx.Window):
  99.     
  100.     def __init__(self, parent, emot, pos):
  101.         wx.Window.__init__(self, parent, pos = pos)
  102.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  103.         events = [
  104.             (wx.EVT_PAINT, self.OnPaint),
  105.             (wx.EVT_ENTER_WINDOW, self.OnMouseInOrOut),
  106.             (wx.EVT_LEAVE_WINDOW, self.OnMouseInOrOut),
  107.             (wx.EVT_LEFT_UP, self.OnLeftUp)]
  108.         for evt, meth in events:
  109.             self.Bind(evt, meth)
  110.         
  111.         (imgpath, self.keys) = emot
  112.         self.SetToolTipString('   '.join(self.keys))
  113.         self.emote = None
  114.         
  115.         try:
  116.             bitmap = wx.Bitmap(imgpath)
  117.             if bitmap.Ok():
  118.                 self.emote = bitmap
  119.         except Exception:
  120.             print_exc = print_exc
  121.             import traceback
  122.             print_exc()
  123.  
  124.         self.UpdateSkin()
  125.  
  126.     
  127.     def UpdateSkin(self):
  128.         size = skin.get('emotibox.emoticonspace', 24)
  129.         self.Size = wx.Size(size, size)
  130.         esize = skin.get('emotibox.maxemoticonsize', 16)
  131.         self.normalbg = skin.get('emotibox.backgrounds.emoticon', None)
  132.         self.hoverbg = skin.get('emotibox.backgrounds.hover', None)
  133.         emote = self.emote
  134.         if emote is not None:
  135.             self.bitmap = emote.ResizedSmaller(esize)
  136.         else:
  137.             self.bitmap = None
  138.  
  139.     
  140.     def OnPaint(self, event):
  141.         dc = wx.BufferedPaintDC(self)
  142.         rect = wx.RectS(self.Size)
  143.         if wx.FindWindowAtPointer() is self:
  144.             self.hoverbg.Draw(dc, rect)
  145.         else:
  146.             self.normalbg.Draw(dc, rect)
  147.         (W, H) = self.GetSize()
  148.         (w, h) = self.bitmap.GetSize()
  149.         if self.bitmap is not None:
  150.             dc.DrawBitmap(self.bitmap, W / 2 - w / 2, H / 2 - h / 2, True)
  151.         
  152.  
  153.     
  154.     def OnMouseInOrOut(self, event):
  155.         event.Skip()
  156.         self.Refresh()
  157.  
  158.     
  159.     def OnLeftUp(self, event):
  160.         textctrl = self.Parent.textctrl
  161.         ip = textctrl.InsertionPoint
  162.         if ip != 0 and textctrl.Value[ip - 1] and textctrl.Value[ip - 1] != ' ':
  163.             space = textctrl.WriteText(' ')
  164.         else:
  165.             space = ''
  166.         textctrl.WriteText(''.join([
  167.             space,
  168.             self.keys[0],
  169.             ' ']))
  170.         self.Parent.Dismiss()
  171.         self.Parent.textctrl.SetFocus()
  172.  
  173.  
  174.